package com.itheima.reggie.controller;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import com.itheima.reggie.common.Constant;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.common.ResultInfo;
import com.itheima.reggie.common.SmsTemplate;
import com.itheima.reggie.domain.User;
import com.itheima.reggie.service.UserService;
import com.sun.xml.bind.v2.model.core.ID;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import javax.xml.transform.Source;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Slf4j
@RestController
public class UserController {

//    @Autowired
//    private SmsTemplate smsTemplate;
//
//    @Autowired
//    private HttpSession session;
//
//    @Autowired
//    private UserService userService;
//
//    //发送验证码
//    @PostMapping("/user/sendMsg")
//    public ResultInfo sendSmsCode(@RequestBody Map<String, String> map) {
//        //1. 接收参数
//        String phone = map.get("phone");
//        //2. 生成验证码
////        String code = RandomUtil.randomNumbers(6); //todo 为了测试方便,临时写死
//        String code = "123";
//
//        //3. 调用阿里云服务把验证吗发送出去
////        smsTemplate.sendSms(phone, code); //todo 为了省钱 暂时注释
//        log.info("发送的验证码是:" + code);
//
//
//        //4. 将验证码保存到session,等候检验
//        session.setAttribute("SMS_CODE", code);
//        //5. 返回结果
//        return ResultInfo.success(null);
//    }
//
//    //注册登录
//    @PostMapping("/user/login")
//    public ResultInfo login(@RequestBody Map<String, String> map) {
//        //1. 接收参数
//        String phone = map.get("phone");
//        String code = map.get("code");//前端传入
//
//        //2. 比对验证码
//        String codeFromSession = (String) session.getAttribute("SMS_CODE");
//        if (StringUtils.isEmpty(code) ||
//                StringUtils.isEmpty(codeFromSession) ||
//                !StringUtils.equals(code, codeFromSession)) {
//            throw new CustomException("验证码有误");
//        }
//
//        //3. 查询手机号在数据库是否存在
//        User user = userService.findByPhone(phone);
//
//        if (user != null) {
//            //4. 查询到了,代表的是一个老用户在登录,而且已经登录成功了
//        } else {
//            //5. 没查询到,代表一个新用户在注册,需要将用户信息保存到user表
//            user = new User();
//            user.setPhone(phone);
//            userService.save(user);
//        }
//
//        //6. 将用户的信息保存到session中,这个名称必须用这个,因为拦截器中是根据这个名字获取的
//        session.setAttribute("SESSION_USER", user);
//
//        //7. 返回成功结果
//        return ResultInfo.success(null);
//    }
//
//
//    @PostMapping("/user/logout")
//    public ResultInfo logout() {
//        session.invalidate();
//        return ResultInfo.success(null);
//    }

    @Autowired
    private HttpSession session;


    //    //发送验证码
//    @PostMapping("/user/sendMsg")
//    public ResultInfo sendMesg(@RequestBody Map<String, String> map) {
//        String phone = map.get("phone");
//        System.out.println(phone);
//        String mesg = "123";
//        log.info("发送的验证码为：" + mesg);
//        session.setAttribute(Constant.USER_PHONE_CODE, mesg);
//        return ResultInfo.success(null);
//    }
    //发送验证码

    @Autowired
    private RedisTemplate redisTemplate;

    @PostMapping("user/sendMsg")
    public ResultInfo sendMesg(@RequestBody Map<String, String> map) {
        String phone = map.get("phone");
        //判断手机号是否输入
        if (StringUtils.isEmpty(phone)) {
            throw new CustomException("请输入手机号");
        }
        String code = "123";
        redisTemplate.opsForValue().set(Constant.USER_PHONE_CODE + phone, code, 10, TimeUnit.MINUTES);
//        session.setAttribute(Constant.USER_PHONE_CODE, code);
        log.info("验证码为：" + code);
        return ResultInfo.success(null);
    }


    @PostMapping("/user/login")
    public ResultInfo login(@RequestBody Map<String, String> map) {

        //接收前端传入的参数
        String phone = map.get("phone");
        String code = map.get("code");
//进行比较判断是否存在
//        String mesg = (String) session.getAttribute(Constant.USER_PHONE_CODE);
        String mesg = (String) redisTemplate.opsForValue().get(Constant.USER_PHONE_CODE + phone);
        if (StringUtils.isEmpty(mesg) || StringUtils.isEmpty(code) || !StringUtils.equals(mesg, code)) {
            throw new CustomException("验证码有误");
        }
//查询手机号在数据库是否存在存在直接通过，没存在就注册，注册登陆一体化
        User byPhone = userService.findByPhone(phone);
        if (byPhone == null) {
            byPhone = new User();
            byPhone.setPhone(phone);
            userService.save(byPhone);
        }
        //放进共享区，交给拦截器，拦截器判断后才放行
        session.setAttribute(Constant.SESSION_USER, byPhone);

        if (redisTemplate.hasKey(Constant.USER_PHONE_CODE + phone)) {
            redisTemplate.delete(Constant.USER_PHONE_CODE + phone);
        }

        return ResultInfo.success(null);
    }

    @Autowired
    private UserService userService;

    @PostMapping("/user/logout")
    public ResultInfo logout() {
        session.invalidate();
        return ResultInfo.success(null);
    }
}